Skip to content

refactor(user): migrate admin routes from server - #2738

Merged
shikanime merged 24 commits into
mainfrom
pr/user-migration
Oct 2, 2026
Merged

shikanime merged 24 commits into
mainfrom
pr/user-migration

Conversation

@shikanime

@shikanime shikanime commented Sep 17, 2026 •

Copy link
Copy Markdown
Member

Issues liées

Refs #1889


Quel est le comportement actuel ?

Les routes d'administration des utilisateurs (/api/v1/users) sont servies par l'ancienne application Fastify apps/server.

Quel est le nouveau comportement ?

Migration du module user vers apps/server-nestjs :

  • UserController, UserService, UserModule.
  • user-queries.utils.ts : sélections Prisma typées.
  • Enregistrement du module dans main.module.ts.
  • Parité des contrats et codes HTTP contre apps/server/src/resources/user/ (400 sur rôle admin inconnu, take: 5 sur la recherche, émission user.upsert par rôle).

Cette PR introduit-elle un breaking change ?

Non.

Autres informations

Recréée pour #1889 (remplace #2498, non réouvrable après suppression de branche).

Comment thread apps/server-nestjs/src/modules/user/user.service.ts Fixed
@github-actions github-actions Bot added the built label Sep 17, 2026
@shikanime shikanime self-assigned this Sep 17, 2026
@shikanime shikanime added this to the 9.27.0 milestone Sep 17, 2026
Comment thread apps/server-nestjs/src/modules/user/user.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.controller.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user-queries.utils.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.module.ts Outdated

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : Changements demandés

Migration fidèle sur le plan requêtes (where, take: 5, rejet de rôle inconnu, union before/after des rôles impactés — la sémantique legacy est respectée). Point positif : la logique where est copiée sans « amélioration » silencieuse, ce qui rend la parité vérifiable ligne à ligne. Un point bloquant de pont événements → plugins, détaillé inline.

Comment thread apps/server-nestjs/src/modules/user/user.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user-queries.utils.ts Outdated
Comment thread apps/server-nestjs/src/modules/user/user.controller.ts Outdated

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And remove // -- comments

@shikanime
shikanime removed this pull request from stack #2747 September 18, 2026 09:45
@shikanime
shikanime changed the base branch from main to pr/admin-role-event-bridge September 18, 2026 09:45
@shikanime
shikanime added this pull request to stack #2751 September 18, 2026 09:46
shikanime added a commit that referenced this pull request Sep 23, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
shikanime added a commit that referenced this pull request Sep 23, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
shikanime added a commit that referenced this pull request Sep 23, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
shikanime added a commit that referenced this pull request Sep 23, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
shikanime added a commit that referenced this pull request Sep 23, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
shikanime and others added 16 commits October 2, 2026 17:08
…nputs

Emit the full { id, oidcGroup, members } payload that the 2749 event
bridge consumers expect, drop as never from the controller spec by
parsing inputs through the shared schemas, and move the relationType
default into buildAllUsersWhere so the controller passes the query
straight through.

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I28676aa618050a7042ed24dfa9e66b896a6a6964
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Ieb2ee298f5d0547bf988787721ed029a6a6a6964

Co-authored-by: Automata <automata@shikanime.studio>
Co-authored-by: Automata <automata@shikanime.studio>
Co-authored-by: Automata <automata@shikanime.studio>
…ion semantics

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>

Co-authored-by: Automata <automata@shikanime.studio>
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
`AllUsersQuerySchema` étant exporté, l'alias `AllUsersQuery` est
redondant ; les consommateurs dérivent le type par `z.infer`.
`LettersQuery` est conservé (utilisé par le client).

Refs #1889

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I5d954715680b8fbcd866edf4bb300dc36a6a6964
Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
- supprimer UserService.createUser et les helpers createUser/getUserByEmail
  (aucun appelant ni route au contrat : chemin mort signalé en revue)
- supprimer l'import faker inutilisé de user.controller.spec.ts
- verrouiller par spec : 400 (BadRequestException) sur adminRole inconnue,
  take:5 sur la recherche par lettres, émission union avant ∪ après

Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>

Co-authored-by: Automata <automata@shikanime.studio>
Reflect.getMetadata assertions pass whether or not the guard is enforced
and add no behavioural coverage; the guard logic stays covered in
user.guard.spec.ts and the controller delegation tests are untouched.

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
…nputs

Emit the full { id, oidcGroup, members } payload that the 2749 event
bridge consumers expect, drop as never from the controller spec by
parsing inputs through the shared schemas, and move the relationType
default into buildAllUsersWhere so the controller passes the query
straight through.

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I28676aa618050a7042ed24dfa9e66b896a6a6964
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Ieb2ee298f5d0547bf988787721ed029a6a6a6964

Co-authored-by: Automata <automata@shikanime.studio>
Co-authored-by: Automata <automata@shikanime.studio>
GET /api/v1/users/matching stays public like the legacy router.

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: Ie8d52f472340f7fe114fbe25f11a32746a6a6964
Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I1601b269c95ef1a8b6496ac93335e2a06a6a6964
Co-authored-by: Automata <automata@shikanime.studio>
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approbation renouvelée : le filtre memberOfIds utilise désormais la relation Prisma projectMembers, tandis que GET /api/v1/users/matching reste public. Fils résolus ; aucune régression identifiée sur cette tête.

@shikanime
shikanime added this pull request to the merge queue Oct 2, 2026
Merged via the queue into main with commit 1fc04ab Oct 2, 2026
34 checks passed
@shikanime
shikanime deleted the pr/user-migration branch October 2, 2026 16:35
StephaneTrebel pushed a commit that referenced this pull request Oct 5, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
StephaneTrebel pushed a commit that referenced this pull request Oct 5, 2026
Aligne le module user sur le pattern établi par le module zone (#2487) :
- `user-queries.utils.ts` : suppression du `userSelect`/`UserRecord` morts,
  signatures sur `Prisma.TransactionClient`, `createUser` purement DB (la
  validation du doublon email monte dans le service en `ConflictException`).
- `user.service.ts` : extraction de `resolveAdminRoleIds`,
  `patchUsersInTx`, `emitImpactedRoleEvents` ; patch des rôles sous
  transaction.
- `user.module.ts` : imports repliés sur `InfrastructureModule` (déjà
  exporté par celui-ci).

Refs #2738

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3bd632f95dd466e585698eba738efcd86a6a6964
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

built refactor Refactor code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants